package br.unidocs.web.bean;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

import br.unidocs.enums.EnumCSS;
import br.unidocs.exceptions.UsuarioInvalidoException;
import br.unidocs.modelo.entidade.Usuario;
import br.unidocs.servico.UsuarioEJB;

public class RegistroUsuarioBackingBean {
	private final Usuario DADOS_NOVO_USUARIO = new Usuario();

	@EJB
	private UsuarioEJB usuarioEjb;

	private String outraSenha;

	public Usuario getDadosNovoUsuario() {
		return DADOS_NOVO_USUARIO;
	}

	public String recuperarSenha() {
		try {
			usuarioEjb.recuperaSenha(outraSenha);
			FacesContext ctx = FacesContext.getCurrentInstance();
			ctx.addMessage(null, new FacesMessage(
					"Senha encaminhada com sucesso."));
		} catch (UsuarioInvalidoException e) {
			FacesContext ctx = FacesContext.getCurrentInstance();
			ctx.addMessage(null, new FacesMessage("e-mail não cadastrado."));
		}
		return "index";
	}

	public String gravaUsuario() {
		if (!outraSenha.equals(DADOS_NOVO_USUARIO.getSenha())) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(" As senhas digitadas nao sao iguais"));
			return "postback";
		}
		DADOS_NOVO_USUARIO.setCssEscolhido(EnumCSS.ORIGINAL);
		usuarioEjb.criaUsuario(DADOS_NOVO_USUARIO);
		return "sucesso";
	}

	public void validaLogin(FacesContext ctx, UIComponent component,
			Object value) {
		// Verifica se não há algum outro usuário com o mesmo login
		try {
			Usuario u = usuarioEjb.localizaPorLogin(value.toString());
			if (u != null) {
				ctx.addMessage(component.getClientId(), new FacesMessage(
						" Login invalido.", " O login " + value.toString()
								+ " já está cadastrado para outro usuário."));
				ctx.validationFailed();
				ctx.renderResponse();
			}
		} catch (UsuarioInvalidoException e) {
			ctx.addMessage(component.getClientId(), new FacesMessage(
					" Login invalido.", " O e-mail " + value.toString()
							+ " não é válido."));
			ctx.validationFailed();
			ctx.renderResponse();
		}
	}

	public void validaEmail(FacesContext ctx, UIComponent component,
			Object value) {
		// Valida a estrutura do email. Ex: nome@subdominio.dominio
		try {
			new InternetAddress(value.toString(), true);
		} catch (AddressException e) {
			ctx.addMessage(component.getClientId(), new FacesMessage(
					" e-mail inválido.", " O e-mail " + value.toString()
							+ " não é válido."));
			ctx.validationFailed();
			ctx.renderResponse();
		}

		// Verifica se não há algum outro usuário com o mesmo e-mail
		try {
			Usuario u = usuarioEjb.localizaPorEmail(value.toString());
			if (u != null) {
				ctx.addMessage(component.getClientId(), new FacesMessage(
						" e-mail inválido.", " O e-mail " + value.toString()
								+ " já está cadastrado para outro usuário."));
				ctx.validationFailed();
				ctx.renderResponse();
			}
		} catch (UsuarioInvalidoException e) {
			ctx.addMessage(component.getClientId(), new FacesMessage(
					" e-mail inválido.", " O e-mail " + value.toString()
							+ " não é válido."));
			ctx.validationFailed();
			ctx.renderResponse();
		}
	}

	public String getOutraSenha() {
		return outraSenha;
	}

	public void setOutraSenha(String outraSenha) {
		this.outraSenha = outraSenha;
	}
}
